home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 140
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin
/
tools
/
dshell
/
dsh333bs.lzh
/
meswin.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-11
|
4KB
|
282 lines
/*
dshell v3
メッセージ窓表示関係
*/
#include "dsh.h"
#define KAGE FALSE
static void win_frame2(int , int , int , int , int , int );
/*
中央のウィンドウを開く
影付きバージョン
*/
void
w_open()
{
int sx = GMODE ? 10 : 26;
B_COLOR(5);
vsync();
#if KAGE
tbox_w2(sx, 14, sx + 46, 20);
#endif
tbox_w2(sx - 1, 13, (sx - 1) + 46, 19);
tbox_w2(sx - 1, 13, (sx - 1) + 46, 14);
B_COLOR(7);
B_LOCATE(sx + ((46 - strlen(Sysmes2)) / 2), 13);
B_PRINT(Sysmes2);
B_COLOR(3);
}
/*
枠の太さが2のボックスをつくる
*/
void
tbox_w2(int sx, int sy, int ex, int ey)
{
struct TBOXPTR win; /* サイズ割りあてが同じなので使いまわしが効く */
sx = sx * 8 - 4;
ex = ex * 8 + 4;
sy = sy * 16 - 8;
ey = ey * 16 + 8;
win.vram_page = 0;
win.x = sx;
win.y = sy;
win.x1 = ex - sx + 1;
win.y1 = ey - sy + 1;
win.line_style = 0xffff;
TXBOX(&win);
win.vram_page = 1;
win.line_style = 0x0000;
TXBOX(&win);
win.vram_page = 0;
win.x++;
win.y++;
win.x1 -= 2;
win.y1 -= 2;
win.line_style = 0xffff;
TXBOX(&win);
win.vram_page = 1;
win.line_style = 0x0000;
TXBOX(&win);
win.vram_page = 0;
win.x++;
win.y++;
win.x1 -= 2;
win.y1 -= 2;
win.line_style = 0x0000;
TXFILL((struct TXFILLPTR *)&win);
win.vram_page = 1;
TXFILL((struct TXFILLPTR *)&win);
}
void
w_close()
{
int i, n = lp + 11;
for (i = 32; i < 32 + 8; i++)
p_lin(n++, i);
vsync();
TXRASCPY(0x8430, 4*8, 3);
}
/*
ウィンドウの中にメッセージを書く
*/
void
w_mes(int l, const char *mes)
{
int dx, n;
dx = (GMODE) ? 0 : 16;
l = (l + 15) * 16 / 4;
TXRASCPY((l << 8) + 0x80, 4, 3);
n = strlen(mes);
if (n < 44)
B_PUTMES(3, 10 + dx, 32, 44 - 1, "");
B_PUTMES(7, 32 + dx - n / 2, 32, n - 1, mes);
TXRASCPY((0x80 << 8) + l, 4, 3);
}
/*
ウィンドウを開いてマウスが押されるのを待つ
wtime/100 秒だけ待って戻る(0の時は押されるまで待ち続ける)
*/
void
w_wait(int wtime)
{
int dmx, dmy, bl, br, et;
if (debugMode && wtime >= 100 && codein_on())
wtime = 0;
if (wtime) {
et = init_et(wtime);
} else {
et = INT_MAX;
}
if (!(GMODE)) {
B_LOCATE(28, 16);
} else {
B_LOCATE(10, 16);
}
if (wtime == 0) { /* メッセージが出なくてもクリックすれば戻るっす */
B_COLOR(5);
B_PRINT("☆ マウスを『クリック』してください ☆");
B_COLOR(3);
}
if (wtime <= 20 && wtime > 0) {
while (et > d_ontime())
;
} else {
wait_mb_off();
do {
p_time(0);
dmsstat(&dmx, &dmy, &bl, &br);
} while (!bl && !br && (et > d_ontime()));
wait_mb_off();
}
}
/*
左上(x0,y0)右下(x1,y1)のフレームを描く。
ku指定 : y=kuの行に横細罫を加える
ex指定 : 下バーメニューから足を生やす(始点x=exから半角4つ分の幅)
*/
void
win_frame(int x0, int y0, int x1, int y1, int ku, int ex)
{
int i;
win_frame2(x0, y0, x1, 1, 2, 3);
for (i = y0 + 1; i < y1; i++) {
win_frame2(x0, i, x1, 6, 0, 6);
}
win_frame2(x0, y1, x1, 4, 2, 5);
if (ku) {
win_frame2(x0, ku, x1, 7, 8, 9);
}
if (ex) {
win_frame2(ex, y1, ex + 4, 3, 0, 1);
}
}
/*
(x0,y0) - (x1,y0)を、
左端cl、中cm、右端crのパターンで描く(フレーム)
*/
static void
win_frame2(int x0, int y0, int x1, int cl, int cm, int cr)
{
static const char *frame[]=
{
" ",
"┏", "━", "┓",
"┗", "┛", "┃",
"┠", "─", "┨"
};
int i;
B_LOCATE(x0, y0);
B_PRINT(frame[cl]);
for (i = x0 + 2; i < x1; i += 2) {
B_PRINT(frame[cm]);
}
B_PRINT(frame[cr]);
}
void
w_copy()
{
w_mes(0, "ファイルのコピー中です");
w_mes(1, "しばらくお待ち下さい");
}
void
w_load()
{
w_mes(0, "ファイルの読み込み中です");
w_mes(1, "しばらくお待ち下さい");
}
void
dabort(const char *mes)
{
w_open();
B_COLOR(GMODE ? 7 : 6);
B_LOCATE((GMODE ? 32 : 48) - strlen(mes) / 2, 13);
B_PRINT(mes);
w_mes(0, "処理を中止します");
w_wait(0);
w_close();
}
void
d_mem()
{
dabort("メモリー不足です");
}
void
d_read()
{
dabort("『ファイルリードエラー』が発生しました");
}
void
d_write()
{
dabort("『ファイルライトエラー』が発生しました");
}
void
d_heap(void)
{
dabort("ヒープを使い切りました");
}
/*
復帰するとアブないエラー
*/
volatile void
d_mfree()
{
w_open();
w_mes(0, "メモリブロックの解放に失敗しました");
w_mes(2, "とりあえず終了します");
w_wait(0);
dsh_abort(1);
}